package join

import (
	"strings"

	"codeup.aliyun.com/lsxd/zltx/adapter/utils/sortx/dict"
)

// KvSort 排序并生成签名字符串
// 将所有的key和value拼接在一起，例如：
// k1=v1&k2=v2&k3=v3
// 最后拼接成字符串，例如：
// k1v1k2v2k3v3
// kvs 键值对列表
// filterEmpty 是否过滤空值
// sep 键值对之间的分隔符
// skipFields 跳过的字段列表
func KvSort(kvs []dict.KeyValue, filter SignFilterFunc, sep string, skipFields []string, valueEncoder dict.ValueEncoder) string {
	var kvStr []string
	for _, kv := range kvs {
		key, value := kv.Key, kv.Value
		// 跳过指定字段
		hasSkip := false
		for _, field := range skipFields {
			if key == field {
				hasSkip = true
			}
		}
		if hasSkip {
			continue
		}
		// 跳过空值
		if filter != nil && filter(key, value) {
			continue
		}
		valStr := kv.ValueString(valueEncoder)

		kvStr = append(kvStr, key+valStr)
	}
	signStr := strings.Join(kvStr, sep)
	return signStr
}
